#include <stdio.h>
#include <stdlib.h>
#include <string.h>

float findmax(float A[], int i, int j)
{
    // printf("into findmax\n");
    float max;
    if (i == j)
    {
        return A[i];
    }
    else
    {
        max = findmax(A, i + 1, j);
        if (A[i] > max)
            return A[i];
        else
            return max;
    }
}

float arraysum(float A[], int i, int j)
{
    float sum = 0;
    if (i == j)
    {
        return A[i];
    }
    else
    {
        return A[i] + arraysum(A, i + 1, j);
    }
}

float arrayavg(float A[], int i, int j)
{
    if (i == j)
    {
        return A[i];
    }
    else
    {
        return (A[i] + (j - i) * arrayavg(A, i + 1, j)) / (j - i + 1);
    }
}

void divide(int A[], int n)
{
    int temp;
    int i = 0, j = n - 1;
    temp = A[i];
    A[i] = A[j];
    A[j] = temp;
    temp = A[i];

    printf("base num is %d \n", temp);

    while (i != j)
    {
        while (j > i && A[j] > temp)
        {
            --j;
        }

        if (i < j)
        {
            A[i] = A[j];
            ++i;
        }

        while (i < j && A[i] < temp)
        {
            ++i;
        }

        if (i < j)
        {
            A[j] = A[i];
            --j;
        }

        printf("result is: \n");
        int a;
        for (a = 0; a < 8; a++)
        {
            printf("%d ", A[a]);
        }
        printf("\n");
    }
    A[i] = temp;
}

// 快速排序
void quicksort(int A[], int left, int right)
{
    int i, j, t, temp;
    if (left > right)
        return;

    temp = A[left]; //temp中存的就是基准数
    i = left;
    j = right;
    while (i != j)
    {
        //顺序很重要，要先从右边开始找
        while (A[j] >= temp && i < j)
            j--;
        //再找右边的
        while (A[i] <= temp && i < j)
            i++;
        //交换两个数在数组中的位置
        if (i < j)
        {
            t = A[i];
            A[i] = A[j];
            A[j] = t;
        }
    }
    //最终将基准数归位
    A[left] = A[i];
    A[i] = temp;

    quicksort(A, left, i - 1);  //继续处理左边的，这里是一个递归的过程
    quicksort(A, i + 1, right); //继续处理右边的 ，这里是一个递归的过程
}

int main()
{
    float A[] = {1, 2, 3, 4, 5, 6, 7, 8};
    float max = findmax(A, 0, 8 - 1);
    printf("max is %f \n", max);
    float sum = arraysum(A, 0, 8 - 1);
    printf("sum is %f \n", sum);
    float avg = arrayavg(A, 0, 8 - 1);
    printf("avg is %f \n", avg);
    // 快速排序
    int array[] = {2, 7, 9, 10, 4, 3, 5, 6};
    int n = 8;
    int i;
    quicksort(array, 0, n - 1);
    for (i = 0; i < n; i++)
        printf("%d ", array[i]);
    return 0;
}
